import { useRef, useCallback, useEffect } from 'react';

/**
 * 记忆化回调函数钩子，避免不必要的重渲染
 * 类似于useCallback，但具有更强的缓存能力，适用于需要保持引用稳定的函数
 * 
 * @param callback 需要被记忆化的回调函数
 * @param dependencies 依赖数组
 * @returns 记忆化后的回调函数
 */
export function useMemoizedCallback<T extends (...args: unknown[]) => unknown>(
  callback: T,
  dependencies: React.DependencyList
): T {
  // 使用ref存储最新的回调函数
  const callbackRef = useRef<T>(callback);
  
  // 在依赖变化时更新callbackRef
  useEffect(() => {
    callbackRef.current = callback;
  }, [callback, ...dependencies]);
  
  // 创建稳定引用的回调函数
  return useCallback(
    ((...args: unknown[]) => {
      // 总是调用最新的回调函数实现
      return callbackRef.current(...args);
    }) as T,
    [] // 依赖为空数组，确保返回的函数引用稳定
  );
}

export default useMemoizedCallback; 